home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / beav_132 / part01 / termio.c < prev    next >
C/C++ Source or Header  |  1991-11-13  |  5KB  |  190 lines

  1. /*
  2.  * The functions in this file negotiate with the operating system for
  3.  * characters, and write characters in a barely buffered fashion on the display.
  4.  * All operating systems.
  5.  */
  6.  
  7. #include    <sys/types.h>    /* 1.13 */
  8.  
  9. #ifdef UNIX    /* System V */
  10.  
  11. #include    <stdio.h>
  12. #include    <signal.h>
  13. #ifdef BSD
  14. #include    <sys/ioctl.h>
  15. #else
  16. #include    <termio.h>
  17. #endif /* BSD */
  18. #include    <errno.h>
  19. #include    <fcntl.h>
  20. #include    "def.h"
  21. int kbdflgs;            /* saved keyboard fd flags  */
  22. int kbdpoll;            /* in O_NDELAY mode         */
  23. int kbdqp;          /* there is a char in kbdq  */
  24. char kbdq;          /* char we've already read  */
  25.  
  26. #ifdef BSD
  27. struct    sgttyb    otermb;
  28. struct    sgttyb    ntermb;
  29. #else
  30. struct  termio  otermio;    /* original terminal characteristics */
  31. struct  termio  ntermio;    /* charactoristics to use inside */
  32. #endif /* BSD */
  33. extern    errno; /* System error number -- Necessary when compiling in BSD 1.13 */
  34.  
  35. int     nrow;                   /* Terminal size, rows.         */
  36. int     ncol;                   /* Terminal size, columns.      */
  37.  
  38. /*
  39.  * This function is called once to set up the terminal device streams.
  40.  * On VMS, it translates TT until it finds the terminal, then assigns
  41.  * a channel to it and sets it raw. On CPM it is a no-op.
  42.  */
  43.  
  44. void ttopen()
  45. {
  46. #ifdef BSD
  47. #ifdef ULTRIX
  48.     struct winsize ttysize;
  49. #else
  50.     struct ttysize ttysize;
  51. #endif
  52.  
  53.     ioctl(0, TIOCGETP, &otermb);    /* save settings    */
  54.     ntermb = otermb;            /* setup new settings    */
  55.     ntermb.sg_flags &= ~ECHO;
  56.     ntermb.sg_flags |= RAW;
  57.     ioctl(0, TIOCSETP, &ntermb);     /* and activate them    */
  58.     kbdpoll = FALSE;
  59.  
  60.     /* on all screens we are not sure of the initial position
  61.        of the cursor                    */
  62.     ttrow = 999;
  63.     ttcol = 999;
  64. #if ULTRIX
  65.     if (ioctl(0, TIOCGWINSZ, &ttysize) == 0) {
  66.         nrow = ttysize.ws_row;
  67.         ncol = ttysize.ws_col;
  68. #else
  69.         if (ioctl(0, TIOCGSIZE, &ttysize) == 0) {
  70.             nrow = ttysize.ts_lines;
  71.             ncol = ttysize.ts_cols;
  72. #endif
  73.         } else {
  74.             nrow = NROW;
  75.             ncol = NCOL;
  76.         }
  77. #else
  78.         ioctl(0, TCGETA, &otermio); /* save old settings */
  79.         ntermio.c_iflag = 0;        /* setup new settings */
  80.         ntermio.c_oflag = 0;
  81.         ntermio.c_cflag = otermio.c_cflag;
  82.         ntermio.c_lflag = 0;
  83.         ntermio.c_line = otermio.c_line;
  84.         ntermio.c_cc[VMIN] = 1;
  85.         ntermio.c_cc[VTIME] = 0;
  86.         ioctl(0, TCSETAW, &ntermio); /* and activate them */
  87.         kbdflgs = fcntl( 0, F_GETFL, 0 );
  88.         kbdpoll = FALSE;
  89.         /* on all screens we are not sure of the initial position
  90.        of the cursor                    */
  91.         ttrow = 999;
  92.         ttcol = 999;
  93.         nrow = NROW;
  94.         ncol = NCOL;
  95. #endif 
  96.     }
  97.  
  98.     /*
  99.  * This function gets called just before we go back home to the command
  100.  * interpreter. On VMS it puts the terminal back in a reasonable state.
  101.  * Another no-operation on CPM.
  102.  */
  103.     void  ttclose()
  104.         {
  105. #ifdef BSD
  106.         if (ioctl(0, TIOCSETP, &otermb) == -1) /* restore terminal settings */
  107.             printf ("closing ioctl on dev 0 failure, error = %d\n", errno);
  108. #else
  109.         if (ioctl(0, TCSETAW, &otermio) == -1) /* restore terminal settings */
  110.             printf ("closing ioctl on dev 0 failure, error = %d\n", errno);
  111.         if (fcntl(0, F_SETFL, kbdflgs) == -1)
  112.             printf ("closing fcntl on dev 0 failure, error = %d\n", errno);
  113. #endif
  114.  
  115.     }
  116.  
  117.     /*
  118.  * Write a character to the display. On VMS, terminal output is buffered, and
  119.  * we just put the characters in the big array, after checking for overflow.
  120.  * On CPM terminal I/O unbuffered, so we just write the byte out. Ditto on
  121.  * MS-DOS (use the very very raw console output routine).
  122.  */
  123.     void ttputc(c)
  124.         {
  125.         fputc(c, stdout);
  126.     }
  127.  
  128.     /*
  129.  * Flush terminal buffer. Does real work where the terminal output is buffered
  130.  * up. A no-operation on systems where byte at a time terminal I/O is done.
  131.  */
  132.     void ttflush()
  133.         {
  134.         fflush(stdout);
  135.     }
  136.  
  137.     /*
  138.  * Read a character from the terminal, performing no editing and doing no echo
  139.  * at all. More complex in VMS that almost anyplace else, which figures. Very
  140.  * simple on CPM, because the system can do exactly what you want.
  141.  */
  142.     ttgetc()
  143.         {
  144.         if( kbdqp )
  145.             kbdqp = FALSE;
  146.         else
  147.         {
  148. #ifdef BSD
  149.             int count;
  150.  
  151.             if (kbdpoll && (ioctl(0, FIONREAD, &count), count == 0))
  152.                 return FALSE;
  153.             read(0, &kbdq, 1);
  154. #else
  155.             if( kbdpoll && fcntl( 0, F_SETFL, kbdflgs ) < 0 )
  156.                 return FALSE;
  157.             kbdpoll = FALSE;
  158.             while (read(0, &kbdq, 1) != 1)
  159.                 ;
  160. #endif
  161.         }
  162.         return ( kbdq & 127 );
  163.     }
  164.  
  165.     /* typahead():    Check to see if any characters are already in the
  166.         keyboard buffer
  167. */
  168.     ttkeyready ()
  169.         {
  170.         if( !kbdqp )
  171.         {
  172. #ifdef BSD
  173.             int count;
  174.  
  175.             if (!kbdpoll && (ioctl(0, FIONREAD, &count), count == 0))
  176.                 return FALSE;
  177.             kbdpoll = TRUE;    /*  fix in 1.13 */
  178.             kbdqp = TRUE;
  179. #else
  180.             if( !kbdpoll && fcntl( 0, F_SETFL, kbdflgs | O_NDELAY ) < 0 )
  181.                 return(FALSE);
  182.             kbdpoll = TRUE;    /*  fix in 1.13 */
  183.             kbdqp = (1 == read( 0, &kbdq, 1 ));
  184. #endif
  185.  
  186.         }
  187.         return ( kbdqp );
  188.     }
  189. #endif
  190.